#include "../GKoSonTools/GKUSART/gkusart.h"
#include "../GKoSonTools/UNIT/unit.h"
GK_USARTIDLE_TYPE GKU1;
GK_USARTIDLE_TYPE GKU3;

uint8_t GK_usart_init(GK_USARTIDLE_TYPE *myuart,uint8_t usartid)
{
	switch(usartid)//绑定关系
	{
		case 1:myuart->huart=&huart1;break;
		case 3:myuart->huart=&huart3;break;
		default :return 0;	
	}
	HAL_UART_Receive_DMA(myuart->huart, myuart->rxBuf, RECEIVELEN);//确定DMA搬运收货地址
	__HAL_UART_ENABLE_IT(myuart->huart, UART_IT_IDLE);//开启空闲中断
	__HAL_UART_CLEAR_IDLEFLAG(myuart->huart);//优化代码：马上清除一次 防止第一次误报
	return 1;
}

//拉起函数：//如果这个函数是写死的回调函数 我希望用我自己的结构体的话那就必须containof技术 现在这个函数本来就是我捏造的 我可以自己修改

void GK_UsartReceive_IDLE(GK_USARTIDLE_TYPE  *myuart)
{
	uint32_t temp;//if(myuart->huart->Instance==USART1)

	if((__HAL_UART_GET_FLAG(myuart->huart,UART_FLAG_IDLE) != RESET))
	{ 
		__HAL_UART_CLEAR_IDLEFLAG(myuart->huart);
		HAL_UART_DMAStop(myuart->huart);
		if(myuart->status)//严重设计缺陷！！IT做了太多的事情！最多callbake拉起一个flag 自己状态机去处理
{
		temp = myuart->huart->hdmarx->Instance->CNDTR;
		myuart->rx_len =  RECEIVELEN - temp; 
//		if(myuart->rx_len==0||myuart->rxBuf[0]==0)//MUST 2 CASE BUG!
//		{
//			//printf("::DMA::BUG::NULL::IDLE\r\n");
//		}

		//printf("::DMA receved::");All_printc(myuart->rxBuf,myuart->rx_len );

		myuart->Idle_callback(myuart);

}
else
{
		temp = myuart->huart->hdmarx->Instance->CNDTR;
		myuart->rx_len =  RECEIVELEN - temp; 
		if(myuart->rx_len==0||myuart->rxBuf[0]==0)//MUST 2 CASE BUG!
		{
			//printf("::DMA::BUG::NULL::IDLE\r\n");
		}
    else
		{
			myuart->rx_flag=1;//拉起
			printf("::DMA receved::");All_printc(myuart->rxBuf,myuart->rx_len );
		}
}
		HAL_UART_Receive_DMA(myuart->huart,myuart->rxBuf,RECEIVELEN);//再次启动DMA接收啦 所以我DMA不是循环模式而是普通模式
	}
}

uint8_t GK_usart_TXRX(GK_USARTIDLE_TYPE  *myuart, uint8_t *TX ,uint16_t TXlen ,uint8_t *RX,uint16_t *RXlen)
{
	uint8_t Cnt = 10;
	HAL_UART_Transmit(myuart->huart, TX, TXlen, 0xFFFF);
	//printf("%s::%d\r\n",__FUNCTION__,Cnt);
	while(Cnt--)//尝试次数 10次   这里面其实需要喂狗 每次这样的情形都有喂狗
	{
		if(myuart->rx_flag)//在中断拉起1
		{
		  memcpy(RX,myuart->rxBuf,myuart->rx_len);
			*RXlen=myuart->rx_len;
			memset(&myuart->rxBuf,0,RECEIVELEN);//用完就毁灭清为0
			myuart->rx_flag=0;
			return 1;
		}
		HAL_Delay(10);
	}
	return 0;    
}
